package main

import "fmt"

func main() {
	// 定义一个长度为 3 的 int 数组
	// var 变量名 [长度]类型
	// 定义后大小不可变
	// 如果未初始化 数组内元素 默认为对应类型的初始值
	var a1 [3]int
	fmt.Printf("a1: %T %+v\n", a1, a1)

	// 指定长度 并初始化
	var a2 = [10]bool{false, true, false}
	fmt.Printf("a2: %T %+v\n", a2, a2)

	// 根据元素数量自动推断长度
	// [...]类型{元素1,元素2...} 为数组
	// []类型{元素1,元素2...} 为 切片
	var a3 = [...]bool{true, true, false}
	fmt.Printf("a3: %T %+v\n", a3, a3)

	// 指定元素下标
	var a4 = [...]bool{0: true, 2: true, 4: true}
	fmt.Printf("a4: %T %+v\n", a4, a4)

	fmt.Println("=========================================================")

	// 数组遍历
	for i, v := range a4 {
		fmt.Printf("%d, %v   ", i, v)
	}

	fmt.Println("\n=========================================================")

	// 多维数组
	var a5 [3][2]int
	fmt.Printf("a5: %T %+v\n", a5, a5)

	// 多维数组 初始化
	var a6 = [3][2]bool{
		1: {true, true},
		{false, 1: true},
	}
	fmt.Printf("a6: %T %+v\n", a6, a6)

	// 多维数组遍历
	for i, a := range a6 {
		fmt.Printf("%d: %v => ", i, a)
		for j, v := range a {
			fmt.Printf("(%d, %v) ", j, v)
		}
		fmt.Printf("\t")
	}

	fmt.Println("\n=========================================================")

	// 数组 为 值类型
	// 支持 == != 操作符
	// [长度]*类型 为指针数组	*[长度]类型 为数组指针
	a7 := [...]int{1, 2, 3}
	a8 := a7
	a8[1] = 8

	fmt.Println(a7)
	fmt.Println(a8)

	fmt.Println("=========================================================")

	// 切片 为 引用类型
	a9 := []int{1, 2, 3}
	a10 := a9
	a10[1] = 8
	fmt.Println(a9)
	fmt.Println(a10)
}
